import java.io.Serializable;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;

//     前3题需要看源码去理解
//  1.如果new HashMap(19), bucket数组多大？
//         >19&&最接近19的二次幂   所以是32
//  2.HashMap什么时候开辟bucket数组占用内存？
//         第一次put的时候  分配默认容量16的内存
//  3.hashMap何时扩容？
//          超过负载因子 就扩容(2倍扩容) 之后要重新哈希
//  4.当两个对象的hashcode相同会发生什么？  冲突
//  5.如果两个建的hashcode相同 你如何获取值对象？  遍历与hashCode值相等时相连的链表 直到相等或者null
//  6.你了解重新调整HashMap大小存在什么问题吗？   重新哈希原来元素到新的链表中



//  反射
//  Java的反射（reflection）机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，
//  都能够调用它的任意方法和属性，既然能拿到那么，我们就可以修改部分类型信息；这种动态获取信息以及动态调用对象方法的功
//  能称为java语言的反射（reflection）机制。
//  .class类



//解决：
public class TestDemo {
//    HashMap源码
//      public class HashMap<K,V> extends AbstractMap<K,V>
//        implements Map<K,V>, Cloneable, Serializable {
//}
//    Serializable表示可序列化的  将对象转换成字符串

//    1.HashMap 初始化容量
//    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//    2.HashMap 最大容量
//    static final int MAXIMUM_CAPACITY = 1 << 30;
//    3.负载因子
//    static final float DEFAULT_LOAD_FACTOR = 0.75f;



//    1. 桶的树化阈值：即 链表转成红黑树的阈值，在存储数据时，当链表长度 > 该值时，则将链表转换成红黑树
//    static final int TREEIFY_THRESHOLD = 8;
//    2. 桶的链表还原阈值：即 红黑树转为链表的阈值，当在扩容（resize（））时（此时HashMap的数据存储位置会重新计算）
//    在重新计算存储位置后，当原有的红黑树内数量 < 6时，则将 红黑树转换成链表
//    static final int UNTREEIFY_THRESHOLD = 6;
//    3. 最小树形化容量阈值：即 当哈希表中的容量 > 该值时，才允许树形化链表 （即 将链表 转换成红黑树）
//    static final int MIN_TREEIFY_CAPACITY = 64;



//      主要有三个构造方法
//          public HashMap() {}             默认数组容量16
//          public HashMap(int initialCapacity){}           自定义初始容量
//          public HashMap(int initialCapacity, float loadFactor) {}       容量和负载因子
}
